/*
 * StyleTag.java
 *
 * Created on 19 aprile 2004, 22.26
 */

package net.ermannofranco.xml.style;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import net.ermannofranco.xml.AbstractTag;
import net.ermannofranco.xml.Tag;

/**
 * 
 * @author ermanno (ermanno.franco@gmail.com)
 */
public class StyleTag extends Tag {

	private static final long serialVersionUID = -7835682306541393038L;

	/**
	 * Creates a new instance of StyleTag Protetto
	 * 
	 * @param level
	 *            contatore di livello per indentazione, gestito automaticamente
	 * @param container
	 *            tag contenitore, automatico
	 */
	protected StyleTag(String nome, int level, Tag container) {
		super(nome, level, container);
	}

	// rifletterci sopra
	/**
	 * @param nome
	 * @return
	 */
	public final Tag addTag(String nome) {
		throw new StyleException("Proibito usare Tag personalizzati in Style");
	}

	/**
	 * @param testo
	 * @return
	 */
	public final AbstractTag addTextBlock(String testo) {
		throw new StyleException(
				"Possibile unicamente usare addCDATA() in Style");
	}

	/**
	 * @param nome
	 * @return
	 */
	public String removeAttribute(String nome) {
		throw new StyleException("Proibito rimuovere attributi in Style");
	}

	/**
	 * @param uri
	 * @return
	 */
	public StyleTag loadCDATAFile(String uri) {
		return loadCDATAFile(uri, 1);
	}

	/**
	 * @param uri
	 * @param startRow
	 * @return autoref
	 */
	public StyleTag loadCDATAFile(String uri, int startRow) {
		FileReader fr;
		try {
			fr = new FileReader(uri);
		} catch (IOException e) {
			throw new StyleException("Impossibile leggere dal file \"" + uri
					+ "\".");
		}
		BufferedReader br = new BufferedReader(fr);
		String line = null;
		StringBuffer sb = new StringBuffer();
		int start = 1;
		try {
			for (; start < startRow; start++) {
				if (br.readLine() == null)
					throw new StyleException("Righe nel file di input \"" + uri
							+ "\" non corrispondenti");
			}
			while ((line = br.readLine()) != null) {
				sb.append("\r\n" + line);
			}
			br.close();
			fr.close();
		} catch (IOException e) {
			throw new StyleException("Impossibile chiudere il file \"" + uri
					+ "\".");
		}
		addCDATA(sb.toString());
		return this;
	}

	/**
	 * @param uri
	 * @param startRow
	 * @param endRow
	 * @return autoref
	 */
	public StyleTag loadCDATAFile(String uri, int startRow, int endRow) {
		FileReader fr;
		File f= new File(uri);
		log.info("file: "+f.getAbsolutePath());
		try {
			fr = new FileReader(uri);
		} catch (IOException e) {
			throw new StyleException("Impossibile leggere dal file \"" + uri
					+ "\".");
		}

		BufferedReader br = new BufferedReader(fr);
		String line = null;
		StringBuffer sb = new StringBuffer();
		int start = 1;
		try {
			for (; start < startRow; start++) {
				if (br.readLine() == null)
					throw new StyleException("Righe nel file di input \"" + uri
							+ "\" non corrispondenti");
			}
			for (; start < endRow; start++) {
				if ((line = br.readLine()) == null)
					throw new StyleException("Righe nel file di input \"" + uri
							+ "\" non corrispondenti");
				sb.append("\r\n" + line);
			}
			br.close();
			fr.close();
		} catch (IOException e) {
			throw new StyleException("Impossibile leggere dal file \"" + uri
					+ "\".");
		}
		addCDATA(sb.toString());
		return this;
	}

	/**
	 * @param uri
	 * @param startRow
	 * @param numOfRows
	 * @return autoref
	 */
	public StyleTag loadCDATALinesFromFile(String uri, int startRow,
			int numOfRows) {
		FileReader fr;
		try {
			fr = new FileReader(uri);
		} catch (IOException e) {
			throw new StyleException("Impossibile leggere dal file \"" + uri
					+ "\".");
		}
		BufferedReader br = new BufferedReader(fr);
		String line = null;
		StringBuffer sb = new StringBuffer();
		int start = 1;
		try {
			for (; start < startRow; start++) {
				if (br.readLine() == null)
					throw new StyleException("Righe nel file di input \"" + uri
							+ "\" non corrispondenti");
			}
			for (; start < startRow + numOfRows; start++) {
				if ((line = br.readLine()) == null)
					throw new StyleException("Righe nel file di input \"" + uri
							+ "\" non corrispondenti");
				sb.append("\r\n" + line);
			}
			br.close();
			fr.close();
		} catch (IOException e) {
			throw new StyleException("Impossibile leggere dal file \"" + uri
					+ "\".");
		}

		addCDATA(sb.toString());
		return this;
	}

	/**
	 * @param select
	 * @return
	 */
	public ValueOf addValueOf(String select) {
		ValueOf t;
		add(t = new ValueOf(getLevel() + 1, this).setSelect(select));
		return t;
	}

}
